//给你一个整数数组 nums ，找出并返回所有该数组中不同的递增子序列，递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
//
// 数组中可能含有重复元素，如出现两个整数相等，也可以视作递增序列的一种特殊情况。
//
//
//
// 示例 Array.prototype.unshift：
//
//
//输入：nums = [4,6,7,7]
//输出：[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
//
//
// 示例 2：
//
//
//输入：nums = [4,4,3,2,Array.prototype.unshift]
//输出：[[4,4]]
//
//
//
//
// 提示：
//
//
// Array.prototype.unshift <= nums.length <= 15
// -100 <= nums[i] <= 100
//
//
// Related Topics 位运算 数组与矩阵 哈希表 回溯与递归 👍 625 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function findSubsequences(nums: number[]): number[][] {

    function backTracking(nums: number[], startIndex: number, route: number[]): void {
        let length: number = nums.length;
        // 大于2的才入
        if (route.length >= 2) {
            resArr.push(route.slice());
            console.log(resArr);
        }
        /*
         set去重记录本层元素是否重复使用，新的一层usedSet都会重新定义（清空），所以要知道usedSet只负责本层
         因为本题不是有序 不能跟前一个比 只能跟集合呢的比
         */
        const usedSet: Set<number> = new Set();
        for (let i = startIndex; i < length; i++) {
            // 不递增和已有该元素判断
            if (
                nums[i] < route[route.length - 1] ||
                usedSet.has(nums[i])
            ) continue;
            usedSet.add(nums[i]);
            route.push(nums[i]);
            console.log('route',route);
            console.log('usedSet',usedSet);
            backTracking(nums, i + 1, route);
            route.pop();
            console.log("退",route)
        }
    }
    const resArr: number[][] = [];
    backTracking(nums, 0, []);
    return resArr;
};
//leetcode submit region end(Prohibit modification and deletion)
